var express = require("express");
var socketIo = require('socket.io');
//鉴定权限
var session = require("express-session");
var lowdb = require("lowdb");
var http = require("http");
var app = express();
var server = require("http").createServer(app);
var io = socketIo(server, { cors: true });
//并引入
var FileSync = require('lowdb/adapters/FileSync');

var adapter = new FileSync('db.json'); // 存储到db.json文件中

//创建好的数据库
var db = lowdb(adapter);
let sessionMiddleware = session({ secret: "DW2009", resave: true, saveUninitialized: true });
// 将public内的静态资源和server服务部署到同一个服务器上,不存在跨域问题
app.use(express.static("public"));
//3a3u9t
//配置
app.use(sessionMiddleware);

app.get("/login", function(req, res) {
    let { phone, password } = req.query;
    if (phone && password) {
        var db_user = db.get("users").find({ phone: phone }).value();
        if (db_user.password === password) {
            req.sessionStore.sessions.user = db_user;
            res.json({
                code: 2000,
                msg: "登录成功！"
            });
        } else {
            res.json({
                code: 2001,
                msg: "用户名或密码错误"
            });
        }
    } else {
        res.json({
            code: 2001,
            msg: "用户名或密码不合法"
        });
    }
})

//测试是否登录成功
app.get("/test", function(req, res) {
    res.json(req.session.user || {});
})


//socket.io 使用中间件
io.use(function(socket, next) {
    //getsocket.io绑定请求
    //绑定之后，在只要有socket地方都可以访问到request
    sessionMiddleware(socket.request, {}, next);
});

//获取所有在线人数的信息
function getOnlineSockets() {
    let userList = [];
    //获取到当前在线的人数
    // console.log(io.sockets.sockets.size);
    io.sockets.sockets.forEach(function(value, item) {
        userList.push(value);
    })

    return userList;
}


function getOnlineUser() {
    let userList = [];
    //获取到当前在线的人数
    // console.log(io.sockets.sockets.size);
    io.sockets.sockets.forEach(function(value, item) {
        userList.push(value.user);
    })

    return userList;
}



io.on("connection", function(socket) {
    const user = socket.request.sessionStore.sessions.user;
    if (user) {
        //socket 上同时存在socket.id 存在socket.request.session.user.uid
        //连接成功之后 我就把uid发放给客户端 每个用户的uid固定
        //[uid]1234--->[socket.id 1111] 第一次连接
        //重新连接  [uid]1234---->[socket.id  1212]


        //拿到已登录用户信息
        socket.user = user;


        var getOnlineSocket = getOnlineSockets();

        //筛选出所有已经登录的用户uid
        getOnlineSocket.filter(function(item, key) {
            return item.user.uid === socket.user.uid;
        }).filter(function(item) {
            //筛选出当前与我登录的id相同的人
            return item.id !== socket.id;
        }).forEach(function(item) {
            //让这些人下线
            item.disconnect(true);
        });
    } else {
        //服务器强行断开连接
        socket.disconnect(true);
        return;
    }

    // //当有人上线时，更新人数给所有在线用户更新在线人数
    io.emit("update:UserList", getOnlineUser());



    //建立连接之后 开始记录历史消息到db.json
    if (!db.get("DW2009").value().length) {
        //新建DW2009群聊
        db.set("DW2009", []).write();
    };
    //用户登录上线时，通知除开我之外的的其他人昵称某某上线了
    socket.broadcast.emit("user:online", socket.user.nickName);


    //返回客户端socket.id，该uid是用来每次自己登录时记录自己的socket.id
    socket.emit("uid", socket.user.uid);


    //返回历史记录
    let historyMsgList = db.get("DW2009").value();
    socket.emit("message:history", historyMsgList);


    //把接收到的消息下发给每一个人，公屏消息
    socket.on("message:public", function(params) {
        let { message } = params;
        //记录发消息的人和发消息时间，以及消息
        let _messsge = { id: socket.user.uid, createTime: Date.now(), message: message, nickName: socket.user.nickName };
        io.emit("message:everyone", _messsge);
        //把它添加到数据库
        db.get('DW2009').push(_messsge).write();
    })

    //当有人下线时更新人数
    socket.on("disconnect", function() {
        //给所有在线用户更新在线人数
        io.emit("update:UserList", getOnlineUser());
    })

})

server.listen(8080);